package com.tarena.lbs.basic.web.service;

import com.tarena.lbs.base.protocol.exception.BusinessException;
import com.tarena.lbs.basic.web.repository.AdminRepository;
import com.tarena.lbs.common.passport.encoder.JwtEncoder;
import com.tarena.lbs.common.passport.enums.Roles;
import com.tarena.lbs.common.passport.principle.UserPrinciple;
import com.tarena.lbs.pojo.basic.po.AdminPO;
import com.tarena.lbs.pojo.passport.param.AdminLoginParam;
import com.tarena.lbs.pojo.passport.vo.LoginVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class LoginService {
    @Autowired
    private AdminRepository adminRepository;
    @Autowired
    private JwtEncoder jwtEncoder;
    public LoginVO doLogin(AdminLoginParam param) throws BusinessException {
        //入参出参 分支 都要打日志
        log.info("后台登录请求 doLogin 入参:{}",param);
        //1.使用入参的phone 查询数据库 仓储层读数据
        AdminPO adminPO = adminRepository.getAdminByPhone(param.getPhone());
        //2.判断是否存在 如果不存在抛异常结束--业务范畴的异常 系统异常 sql错误 连接超时
        if (adminPO == null){
            log.info("后台登录请求 doLogin 手机号不存在 入参:{}",param);
            //手机号不存在 异常BusinessException
            //异常参数2个 1. code状态码 2.message异常提示 对应Result code message
            //Result code状态码 0表示该请求成功 其他表示该请求失败
            throw new BusinessException("-2","该手机号不存在");
        }
        //3.判断密码是否正确 考虑账号注册时候的密码加密问题
        matchPassword(param.getPassword(),adminPO.getAccountPassword());
        //4.登录成功 生成JWT
        //UserPrinciple 是jwt的体,包含用户数据的重点信息
        UserPrinciple userPrinciple = new UserPrinciple();
        userPrinciple.setId(adminPO.getId());
        userPrinciple.setNickname(adminPO.getNickname());
        //角色是一个枚举对象 在后台管理中 有2个角色 admin表格 type=0 平台 type=1 商家
        //在认证对象放的角色是一个枚举Role ADMIN SHOP USER
        userPrinciple.setRole(adminPO.getAccountType()==0?Roles.ADMIN:Roles.SHOP);
        String jwt = jwtEncoder.generateToken(userPrinciple);
        //5.封装LoginVO
        LoginVO loginVO = new LoginVO();
        loginVO.setJwt(jwt);
        loginVO.setId(adminPO.getId());
        loginVO.setNickname(adminPO.getNickname());
        return loginVO;
    }

    private void matchPassword(String password, String accountPassword) throws BusinessException {
        //入参 password 提交的密码 accountPassword 查询数据库的密码
        //使用工具类判断比较方便 需要考虑空和相等
        boolean equals = StringUtils.equals(password, accountPassword);
        if (!equals){
            log.info("密码不相等,入参密码:{},数据库密码:{}",password,accountPassword);
            //手机号不存在 异常BusinessException
            //异常参数2个 1. code状态码 2.message异常提示 对应Result code message
            //Result code状态码 0表示该请求成功 其他表示该请求失败
            throw new BusinessException("-2","密码不相等");
        }
    }
}
